package com.Akronmcp.hta.obj;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**特效生成器类*/
public class HDancer {
	
	String type;
	//生成器类型名称
	
	public static Map<String,HDancer> htdMap = new HashMap<String,HDancer>();
	//储存生成器的列表
	
	/**定义生成器类型名称*/
	public HDancer(String type)
	{
		this.type = type;
		htdMap.put(type,this);
	}
	
	/**生成特效的方法,需要重写,输入默认文本和其他参数生成每一帧储存进list内
	 * 参数为:储存帧的列表,刷新率,默认文本,其他参数
	 * */
	public void dance(List<String> sl,int t,String text,String...str) {};
	
	/**根据列表内的生成器生成特效,输入默认文本和其他参数生成每一帧储存进list内*/
	public static void Dance (List<String> sl,String type,int tt,String text,String...str) throws Exception 
	{
		
		if(!htdMap.isEmpty())
		for(String ttype:htdMap.keySet())
		{
			
			if(type.equals(ttype))
			{
			 try
			 {
				htdMap.get(ttype).dance(sl, tt,text, str); 
			 }catch(Exception e)
			 {
				e.printStackTrace();
				System.out.print("§a生成特效配置出错,检查hop节点的"+ttype);
			 }
				
		      
			  break;
			}
			
		}
	

	}
	
	public String getType()
	{
		return type;
	}
	public void setType(String type)
	{
	   this.type = type;
	}
	
	/**加载预设的生成器*/
    public static void loadPreDancer()
    {
    	
    	//流动闪烁,从左
    	new HDancer("FLOW_LEFT")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,插入间隔,前文本,后文本,降速比
				
    		  String s = text;//处理文本
    		  int sp = 1;//火车长
    		  
    		  int detime = 1;//降速比
    		   
    		  String pre = "§e";//火车尾(左边所以用pre)
    		  String last = "";//火车头
    		  
			  if(str.length>0)
			  if(!str[0].equals(""))
			   s = str[0];
			  //参数设置列  
			  
			  if((str.length>1)&&(!str[1].equals("")))
			   sp = Integer.valueOf(str[1]);
			  
			  if((str.length>2)&&(!str[2].equals("")))
    	       pre = str[2];
			  
			  if((str.length>3)&&(!str[3].equals("")))
	    	   last = str[3];
			  
			  if((str.length>4)&&(!str[4].equals("")))
		   	   detime = Integer.valueOf(str[4]);
			  
			  
			int sp2 = sp;//临时间隔
			
    	    for(int i=0;i<(s.length()+sp+1);i++)
    	    {
    	    	StringBuffer s2 = new StringBuffer(s);
    	    	//原处理文本
    	    	
    	    	if(i<s2.length())
    	    	if(String.valueOf(s2.charAt(i)).equals("§"))
    	    	{ //车头跳过颜色代码
    	    		i++;
    	    		
    	    		sp2 = sp2+2;
    	    		
    	    		
    	    		continue;
    	    	}
    	    	
    	    	if(i-sp2 >= 0)
    	    	if(sp2>sp)
    	    	if(String.valueOf(s2.charAt(i-sp2)).equals("§"))
    	    	{ //车尾收回颜色代码位
    	    		
        	        sp2 = sp2-2;
    	    	    i--;
    	    	    continue;
    		
    	    	}
    	    	
    	    	
    	    	
    	    	if(i<=s2.length())
    	    	{//车头
    	    	  s2.insert(i,last);
    	    	}else
    	    	{
    	    	  s2.append(last);
    	    	}
    	    	
    	    	
    	    	
    	    	if(i-sp2>=0)
    	    	{//车尾
    	    	  s2.insert(i-sp2,pre);
    	    	}else
    	    	{
    	    	  s2.insert(0,pre);
    	    	}
        		
        		
    	    	
        	    sl.add(s2.toString());
        	    //处理好加入
        	    
        	    for(int j =0;j<detime-1;j++)
        	     {//延时处理
        	    	sl.add("-");
        	     }
        	    
    	      }
    	    
    			
    			
			}
			
		};
    	
    	//流动闪烁,从右
		new HDancer("FLOW_RIGHT")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,插入间隔,前文本,后文本
			  
			 
			   rever("FLOW_LEFT",sl, t, text, str);	
			
			}
			
			
		};

		//停留
		new HDancer("STAY")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,停留时间,时间单位
				String s = text;
				
				int stay = 3;
				//停留时间
				
				String d = "s";
				//单位
				
				if(str.length>0)
				if(!str[0].equals(""))
				 s = str[0];
				
				if((str.length>1)&&(!str[1].equals("")))
				 stay = Integer.valueOf(str[1]);
				
				if((str.length>2)&&(!str[2].equals("")))
				 d = str[2];
				
				sl.add(s);//预设文本
				
				if(d.equals("s"))//以s为单位
				for(int i=1;i<(int)(20/(double)t)*stay;i++)
				{
				   sl.add("-");	
					
				}
				
				if(d.equals("t"))//以刷新次为单位
				for(int i=1;i<stay;i++)
				{
				   sl.add("-");	
						
				}
				
				
				
			}
			
			
		};

		//计时器
		new HDancer("TIMER")
		{
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,停留时间,时间单位,模式,前缀,后缀
				String s = text;
				
				int stay = 10;
				//停留时间
				
				String d = "s";
				//单位
				String ms = "num";
				
				String pre = "";
				String last = "";
				
				if(str.length>0)
				if(!str[0].equals(""))
				 s = str[0];
				
				if((str.length>1)&&(!str[1].equals("")))
				 stay = Integer.valueOf(str[1]);
				
				if((str.length>2)&&(!str[2].equals("")))
				 d = str[2];
				
				if((str.length>3)&&(!str[3].equals("")))
				ms = str[3];
				
				if((str.length>4)&&(!str[4].equals("")))
					pre = str[4];
				if((str.length>5)&&(!str[5].equals("")))
					last = str[5];
				
				sl.add(" ");	
				
				if(ms.equals("num"))
				{
					 if(d.equals("s"))//以s为单位
					 for(int i=0;i<(int)(20/(double)t)*stay;i++)
					 {
					   sl.add(pre+(stay-(int)(((double)i/20)*t))+last);	
						
					 }
					
					 if(d.equals("t"))//以刷新次为单位
					 for(int i=0;i<stay;i++)
					 {
						 sl.add(pre+(stay-i)+last);	
					 }
				}else if(ms.equals("bar"))
				{
					 if(d.equals("s"))//以s为单位
					 for(int i=0;i<(int)(20/(double)t)*stay;i++)
					 {
						 StringBuffer mid = new StringBuffer();
						 for(int j=0;j<(stay-(int)(((double)i/20)*t));j++)
						 {
							 mid.append(s);
						 }
						 for(int j=0;j<(int)(((double)i/20)*t);j++)
						 {
							 mid.append(" ");
							 
						 }
						 
						 
					   sl.add(pre+mid+last);	
						
					 }
					
					 if(d.equals("t"))//以刷新次为单位
					 for(int i=0;i<stay;i++)
					 {
						 StringBuffer mid = new StringBuffer();
						 for(int j=0;j<(stay-i);j++)
						 {
							 mid.append(s);
							 
						 }
						 for(int j=0;j<i;j++)
						 {
							 mid.append(" ");
							 
						 }
						 
						 sl.add(pre+mid+last);	
					 }
					
				}
				
				sl.add(" ");	
				
				
				
			} 
		};
		
		//计时器,反向
		new HDancer("TIMER_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,停留时间,时间单位,模式,前缀,后缀
			  
			 
			   rever("TIMER",sl, t, text, str);	
			
			}
			
			
		};
		
		//闪烁
		new HDancer("FLASH")
		{
		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,闪烁颜色代码,次数,降速比
			 
				String s = text;
				String code = "§e";
				
				int times = 3;
				int detime = 1;
				
				if(str.length>0)
				if(!str[0].equals(""))
				s = str[0];
					
				if((str.length>1)&&(!str[1].equals("")))
				 code = str[1];
				
				if((str.length>2)&&(!str[2].equals("")))
				 times = Integer.valueOf(str[2]);
				
				if((str.length>3)&&(!str[3].equals("")))
				 detime = Integer.valueOf(str[3]);	
				
					
				
				for(int i=0;i<times;i++)
				{
					sl.add(code + s.replaceAll("§(.{1})", ""));
					
					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	        	    
					
					sl.add(s);
					
					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	        	    
					
					
				}
				
				
				
			}
			
		};
    	
		//彩虹闪烁
		new HDancer("RAINBOW_FLASH")
		{
		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前置颜色代码,次数,降速比
			 
				String s = text;
				String[] codes = {"§c","§6","§e","§a","§d","§b"};
				String pre = "";
				
				int times = 3;
				int detime = 1;
				
				if(str.length>0)
				if(!str[0].equals(""))
				s = str[0];
				
				if((str.length>1)&&(!str[1].equals("")))
				 pre = str[1];
				
				if((str.length>2)&&(!str[2].equals("")))
				 times = Integer.valueOf(str[2]);
				
				if((str.length>3)&&(!str[3].equals("")))
				 detime = Integer.valueOf(str[3]);	
				
				s = s.replaceAll("§(.{1})", "");	
				
				
				for(int i=0;i<times;i++)
				{
					Random ra =new Random();
					
					sl.add(codes[ra.nextInt(codes.length)] +pre+ s.replaceAll("§(.{1})", ""));
					
					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	        	    
					
					sl.add(codes[ra.nextInt(codes.length)] +pre+ s.replaceAll("§(.{1})", ""));
					
					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	        	    
					
					
				}
				
				
				
			}
			
		};
 
        //彩虹星闪
		new HDancer("RAINBOW_STAR")
		{
		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前置颜色代码,次数,降速比
			 
				String s = text;
				String[] codes = {"§c","§6","§e","§a","§d","§b"};
				String pre = "";
				
				int times = 3;
				int detime = 1;
				
				if(str.length>0)
				if(!str[0].equals(""))
				s = str[0];
				
				if((str.length>1)&&(!str[1].equals("")))
				 pre = str[1];
				
				if((str.length>2)&&(!str[2].equals("")))
				 times = Integer.valueOf(str[2]);
				
				if((str.length>3)&&(!str[3].equals("")))
				 detime = Integer.valueOf(str[3]);	
				
				s = s.replaceAll("§(.{1})", "");	
				
				for(int i=0;i<times*2;i++)
				{
					Random ra =new Random();
					String s1 = s.replaceAll("§(.{1})", "");
					StringBuffer s2 = new StringBuffer(s1);
					
					for(int x=1;x<=s1.length();x++)
					{
						s2.insert(s1.length()-x, 
								codes[ra.nextInt(codes.length)] +pre);
						
					}
					
					sl.add(s2.toString());
					
					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	        	    
				
				}
				
				
				
			}
			
		};

		//弹出
		new HDancer("BOUNCE")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前文本,后文本,降速比
				
				String s = text;//处理文本
	    	
	    		int detime = 1;//降速比
	    		   
	    		String pre = "";//火车尾(左边所以用pre)
	    		String last = "";//火车头
				
	    		if(str.length>0)
	  		    if(!str[0].equals(""))
	  			  s = str[0];
	  			  //参数设置列  

	  			if((str.length>1)&&(!str[1].equals("")))
	      	      pre = str[1];
	  			  
	  			if((str.length>2)&&(!str[2].equals("")))
	  	    	  last = str[2];
	  			  
	  			if((str.length>3)&&(!str[3].equals("")))
	  		   	  detime = Integer.valueOf(str[3]);	
				
	  				
	  			
	  			for(int i=0;i<=s.length();i++)
	  			{//逐次延长
	  				if(i!=s.length())
	  				if(String.valueOf(s.charAt(i)).equals("§"))
	  				{
	  					i++;
	  					continue;
	  				}
	  					
	  					
	  				StringBuffer s1 = new StringBuffer();
	  				s1.append(pre);
	  				s1.append(s.substring(0,i));
	  				s1.append(last);
	  				
	  				sl.add(s1.toString());
	  			    
	  				for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	  				
	  			}
	  			
				
			}
		};
      
		//弹出,反向
		new HDancer("BOUNCE_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("BOUNCE",sl, t, text, str);	
			  
			}
			
			
		};
    
		//火车,从左
		new HDancer("TRAIN_LEFT")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前文本,后文本,降速比
				
				String s = text;//处理文本
	    	
	    		int detime = 1;//降速比
	    		   
	    		String pre = "";//火车尾(左边所以用pre)
	    		String last = "";//火车头
				
	    		if(str.length>0)
	  		    if(!str[0].equals(""))
	  			  s = str[0];
	  			  //参数设置列  

	  			if((str.length>1)&&(!str[1].equals("")))
	      	      pre = str[1];
	  			  
	  			if((str.length>2)&&(!str[2].equals("")))
	  	    	  last = str[2];
	  			  
	  			if((str.length>3)&&(!str[3].equals("")))
	  		   	  detime = Integer.valueOf(str[3]);	
				
	  			s = s.replaceAll("§(.{1})", "");	
	  			
	  			for(int i=0;i<=s.length();i++)
	  			{//逐次延长
	  				StringBuffer s2 = new StringBuffer();
	  		        
	  			    s2.append(pre);
	  			    s2.append(s.substring(s.length()-i, s.length()));
	  		        s2.append(last);
	  		        
	  		        
	  		        for(int x = 0;x<s.length()-i;x++)
	  		        {
	  		        	s2.append(" ");
	  		        }
	  		        	
	  		        sl.add(s2.toString());
	  		        
	  				for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	  				
	  			}
	  			
				
			}
		};
        
		//火车,从右
		new HDancer("TRAIN_RIGHT")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前文本,后文本,降速比
				
				String s = text;//处理文本
	    	
	    		int detime = 1;//降速比
	    		   
	    		String pre = "";//火车尾(左边所以用pre)
	    		String last = "";//火车头
				
	    		if(str.length>0)
	  		    if(!str[0].equals(""))
	  			  s = str[0];
	  			  //参数设置列  

	  			if((str.length>1)&&(!str[1].equals("")))
	      	      pre = str[1];
	  			  
	  			if((str.length>2)&&(!str[2].equals("")))
	  	    	  last = str[2];
	  			  
	  			if((str.length>3)&&(!str[3].equals("")))
	  		   	  detime = Integer.valueOf(str[3]);	
				
	  				
	  			
	  			for(int i=0;i<=s.length();i++)
	  			{//逐次延长
	  				if(i!=s.length())
	  				if(String.valueOf(s.charAt(i)).equals("§"))
	  				{
	  					i++;
	  					continue;
	  				}
	  				
	  				StringBuffer s2 = new StringBuffer();

	  				for(int x = 1;x<s.length()-i;x++)
	  		        {
	  		        	s2.append(" ");
	  		        }
	  				
	  			    s2.append(pre);
	  			    s2.append(s.substring(0,i));
	  		        s2.append(last);

	  		        	
	  		        sl.add(s2.toString());
	  		        
	  				for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	  				
	  			}
	  			
				
			}
		};
        
		//火车,从左,反向
		new HDancer("TRAIN_LEFT_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("TRAIN_LEFT",sl, t, text, str);	
			  
			}
			
			
		};

		//火车,从右,反向
		new HDancer("TRAIN_RIGHT_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("TRAIN_RIGHT",sl, t, text, str);	
			  
			}
			
			
		};

		//弹幕经过,从右
		new HDancer("PASS_RIGHT")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,尺寸,前文本,后文本,降速比
				
				String s = text;//处理文本
	    	
	    		int detime = 1;//降速比
	    		int size = 8;
	    		
	    		String pre = "";//火车尾(左边所以用pre)
	    		String last = "";//火车头
				
	    		if(str.length>0)
	  		    if(!str[0].equals(""))
	  			  s = str[0];
	  			  //参数设置列  
	    		
	    		if((str.length>1)&&(!str[1].equals("")))
	    		  size = Integer.valueOf(str[1]);	
	    		
	  			if((str.length>2)&&(!str[2].equals("")))
	      	      pre = str[2];
	  			  
	  			if((str.length>3)&&(!str[3].equals("")))
	  	    	  last = str[3];
	  			  
	  			if((str.length>4)&&(!str[4].equals("")))
	  		   	  detime = Integer.valueOf(str[4]);	
				
	  			s = s.replaceAll("§(.{1})", "");	
	  			
	  			StringBuffer s2 = new StringBuffer();
	  			for(int x = 0;x<size;x++)
  		        {
  		        	s2.append(" ");
  		        }
	  			s2.append(s);
	  			for(int x = 0;x<size;x++)
  		        {
  		        	s2.append(" ");
  		        }//构造长文>头尾加一堆空格
	  			
	  			
	  			for(int i=0;i<s2.length()-size;i++)
	  			{//窗口在长文里移动
	  				
	  				
	  				StringBuffer s3 = new StringBuffer();
	  			    s3.append(pre);
	  			    s3.append(s2.substring(i, i+size));
	  		        s3.append(last);
	  		        
	  		        
	  		       
	  		        sl.add(s3.toString());
	  		        
	  				for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	  				
	  			}
	  			
				
			}
		};
        
		//弹幕经过,从左
		new HDancer("PASS_LEFT")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("PASS_RIGHT",sl, t, text, str);	
			}
			
			
		};

		//链条连接,从左
		new HDancer("CHAIN_LEFT")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前文本,后文本,降速比
				
				String s = text;//处理文本
	    	
	    		int detime = 1;//降速比
	    		   
	    		String pre = "";//火车尾(左边所以用pre)
	    		String last = "";//火车头
				
	    		if(str.length>0)
	  		    if(!str[0].equals(""))
	  			  s = str[0];
	  			  //参数设置列  

	  			if((str.length>1)&&(!str[1].equals("")))
	      	      pre = str[1];
	  			  
	  			if((str.length>2)&&(!str[2].equals("")))
	  	    	  last = str[2];
	  			  
	  			if((str.length>3)&&(!str[3].equals("")))
	  		   	  detime = Integer.valueOf(str[3]);	
				
	  					
	  			
	  			for(int i=0;i<=s.length();i++)
	  			{//逐次延长
	  				if(i!=s.length())
	  				if(String.valueOf(s.charAt(i)).equals("§"))
	  				{
	  					i++;
	  					continue;
	  				}
	  				
	  				StringBuffer s2 = new StringBuffer();
	  				
	  			    s2.append(pre);
	  			    s2.append(s.substring(0,i));
	  		        s2.append(last);

	  		        for(int x = 1;x<s.length()-i;x++)
	  		        {
	  		        	s2.append(" ");
	  		        }
	  		        	
	  		        sl.add(s2.toString());
	  		        
	  				for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	  				
	  			}
	  			
				
			}
		};
        
		//链条连接,从右
		new HDancer("CHAIN_RIGHT")
    	{
    		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前文本,后文本,降速比
				
				String s = text;//处理文本
	    	
	    		int detime = 1;//降速比
	    		   
	    		String pre = "";//火车尾(左边所以用pre)
	    		String last = "";//火车头
				
	    		if(str.length>0)
	  		    if(!str[0].equals(""))
	  			  s = str[0];
	  			  //参数设置列  

	  			if((str.length>1)&&(!str[1].equals("")))
	  			if(!str[1].equals(""))
	      	      pre = str[1];
	  			  
	  			if((str.length>2)&&(!str[2].equals("")))
	  	    	  last = str[2];
	  			  
	  			if((str.length>3)&&(!str[3].equals("")))
	  		   	  detime = Integer.valueOf(str[3]);	
				
	  			s = s.replaceAll("§(.{1})", "");		
	  			
	  			
	  			for(int i=0;i<=s.length();i++)
	  			{//逐次延长
	  				StringBuffer s2 = new StringBuffer();
	  		        
	  				for(int x = 1;x<s.length()-i;x++)
	  		        {
	  		        	s2.append(" ");
	  		        }
	  				
	  			    s2.append(pre);
	  			    s2.append(s.substring(s.length()-i, s.length()));
	  		        s2.append(last);
	  		        
	  		        	
	  		        sl.add(s2.toString());
	  		        
	  				for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	  				
	  			}
	  			
				
			}
		};

        
		new HDancer("CHAIN_LEFT_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("CHAIN_LEFT",sl, t, text, str);	
			  
			}
			
			
		};

		
		new HDancer("CHAIN_RIGHT_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("CHAIN_RIGHT",sl, t, text, str);	
			  
			}
			
			
		};

		//沙粒
		new HDancer("SAND")
		{
		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前置颜色代码,淡出率,降速比
			 
				String s = text;
				String pre = "";
				
				int fade = 1;
				int detime = 1;
				
				if(str.length>0)
				if(!str[0].equals(""))
				s = str[0];
				
				if((str.length>1)&&(!str[1].equals("")))
				 pre = str[1];
				
				if((str.length>2)&&(!str[2].equals("")))
				 fade = Integer.valueOf(str[2]);
				
				if((str.length>3)&&(!str[3].equals("")))
				 detime = Integer.valueOf(str[3]);	
				
				s = s.replaceAll("§(.{1})", "");		
				
				List<Integer> in = new ArrayList<Integer>();
				StringBuffer s2 = new StringBuffer();
				for(int i=0;i<s.length();i++)
				{//构造数字列和空格串
					in.add(i);
					s2.append(" ");
				}
				Random ra =new Random();
				
				for(int i=0;i<s.length()/(double)fade;i++)
				{//把字符塞入空格串,按数字列随机处理
					
					for(int x=0;x<fade;x++)
					{
						if(!in.isEmpty())
						{
						 int in2 = in.get(ra.nextInt(in.size()));
						
						 s2.replace(in2,
								   in2+1, 
								String.valueOf(s.charAt(in2)));
						
						 in.remove(in.indexOf(in2));
						
						}
					}
					
					
					
					sl.add(pre+s2.toString());
					
					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
					
				}
				

				
			}
			
		};
		
		//沙粒,反向
		new HDancer("SAND_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("SAND",sl, t, text, str);	
			  
			}
			
			
		};

		//坠落
		new HDancer("DROP")
		{
		
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//集合,刷新率,默认文本,/选择文本,前置颜色代码,掉落间隔,降速比
			 
				String s = text;
				String pre = "";
				
				int drop = 2;
				int detime = 1;
				
				if(str.length>0)
				if(!str[0].equals(""))
				s = str[0];
				
				if((str.length>1)&&(!str[1].equals("")))
				 pre = str[1];
				
				if((str.length>2)&&(!str[2].equals("")))
				 drop = Integer.valueOf(str[2]);	
				
				if((str.length>3)&&(!str[3].equals("")))
				 detime = Integer.valueOf(str[3]);	
				
				StringBuffer spa = new StringBuffer();
				for(int i=0;i<drop;i++)
				{//构造大空格
				  spa.append(" ");
					
				}
			    
				sl.add(" ");
			
				s = s.replaceAll("§(.{1})", "");		
				
				StringBuffer s2 = new StringBuffer(s);
				
				
				for(int x=1;x<=s.length();x++)
				{//塞入大空格
					s2.insert(s.length()-x, 
							   spa.toString());
					
				}
				
				for(int i=0;i<s.length()*drop;i++)
				{//除去空格
					
					int in = s2.indexOf(" ");	
					s2.delete(in,in+1);//除去空格
					
					sl.add(pre+s2.substring(0,s.length()).toString());
					

					for(int j =0;j<detime-1;j++)
	        	    {//延时处理
	        	    	sl.add("-");
	        	    }
	        	    
				
				}
				
				sl.add(" ");
				
			}
			
		};

		//坠落,反向
		new HDancer("DROP_OB")
		{
			
			@Override
			public void dance(List<String> sl,int t,String text,String...str)
			{//复制操作
			  
				rever("DROP",sl, t, text, str);	
			  
			}
			
			
		};
		
		
		
    }
	
    /**反转对应类型的生成器帧数生成顺序,生成新帧数列表*/
    public void  rever(String fromtype,List<String> sl,int t,String text,String...str)
    {
    	
    	List<String> sl2 = new ArrayList<String>(); 
		  for(String ttype:htdMap.keySet())
		  {
			 if(ttype.equals(fromtype))
			 {
				 htdMap.get(ttype).dance(sl2, t, text, str);
				 break;
			 }
			  
		  }
		  //先从原来的类型生成帧列表
		  
		  for(int i = sl2.size();i>0;i--)
		  {//反转帧列表,并添加进list
			 sl.add(sl2.get(i-1)) ;
		  }
		  
    }
    	
    
    
    
}
